package com.dhkj.web.basic;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dhkj.web.bean.Demo;
import com.dhkj.web.bean.DiningTableListDto;
import com.dhkj.web.bean.JiaoBanRes;
import com.dhkj.web.bean.KlStateRes;
import com.dhkj.web.bean.MacMainpFoodMenu;
import com.dhkj.web.bean.MacMainpSbruanDinner;
import com.dhkj.web.bean.ReserveListDto;
import com.dhkj.web.bean.Result;
import com.dhkj.web.bean.SysUserModel;

import java.util.List;

import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Query;

public interface ApiUrl {
    //    /**
//     * 有效链接
//     */
//    @GET(Constans.retrofit)
//    Call<Bean> getRetrofit();
//
//    @GET(Constans.retrofit)
//    Observable<BaseResponse<Demo>> getDemo();
//


    @POST("dr/login")
    @FormUrlEncoded
    Observable<Result<String>> login(@Field("user") String user, @Field("pass") String pass, @Field("deviceId") String deviceId);

    @POST("dr/deviceSign")
    Observable<Result<String>> deviceSign(@Query("deviceId") String deviceId);

    @GET("dr/getServerTime")
    Observable<Result<String>> getServerTime();

    @GET("dr/down/getBaseSysInfo")
    Observable<Result<String>> getBaseSysInfo(@Query("userId") String userId, @Query("deviceId") String deviceId);


    @Headers("Accept:application/json")
    @POST("dr/pay/consumptionTerminal/onLineConsume")
    Observable<Result<JSONObject>> onLineConsume(@Body RequestBody body);



    @Headers("Accept:application/json")
    @POST("dr/pay/consumptionTerminal/checkOrder")
    Observable<Result<JSONObject>> checkOrder(@Body RequestBody body);

    @Headers("Accept:application/json")
    @POST("dr/pay/consumptionTerminal/closeOrder")
    Observable<Result<JSONObject>> closeOrder(@Body RequestBody body);

    @Headers("Accept:application/json")
    @POST("dr/pay/refundProduct")
    Observable<Result<JSONObject>> refundProduct(@Body RequestBody body);


    @Headers("Accept:application/json")
    @POST("dr/pay/consumptionTerminal/onLineConsumeCash")
    Observable<Result<JSONObject>> onLineConsumeCash(@Body RequestBody body);


    @Headers("Accept:application/json")
    @POST("dr/pay/consumptionTerminal/facePay")
    Observable<Result<JSONObject>> facePay(@Body RequestBody body);

    @Headers("Accept:application/json")
    @POST("dr/down/getFk")
    Observable<Result<String>> getFk(@Body RequestBody body);

    @PUT("dr/sysSet/addSbruanDinner")
    Observable<Result<List<MacMainpSbruanDinner>>> addSbruanDinner(@Query("deviceId") String deviceId, @Query("bm") String bm,
                                                                   @Query("beginTime") String beginTime, @Query("endTime") String endTime);
    @GET("dr/orders/getJiaoBan")
    Observable<Result<JiaoBanRes>> getJiaoBan(@Query("deviceId") String deviceId, @Query("startTime") String startTime,
                                                    @Query("endTime") String endTime, @Query("posNumList") List<String> posNumList);

    @Headers("Accept:application/json")
    @POST("dr/foods/menu/add")
    Observable<Result<String>> foodsMenuAdd(@Body RequestBody body);

    @GET("dr/foods/menu/list")
    Observable<Result<List<MacMainpFoodMenu>>> getFoodsMenuList();

    @Headers("Accept:application/json")
    @POST("dr/orders/unOnLine")
    Observable<Result<String>> unOnLine(@Body RequestBody body);


    @GET("dr/sysSet/getKlState")
    Observable<Result<List<KlStateRes>>> getKlState(@Query("deviceId") String deviceId);


    @GET("dr/sysSet/getFk")
    Observable<Result<JSONObject>> getFk(@Query("deviceId") String deviceId, @Query("cardsn") String cardsn);


    @GET("dr/orders/getLcReport")
    Observable<Result<JSONObject>> getLcReport(@Query("deviceId") String deviceId, @Query("auth") String auth);

    @GET("dr/orders/getTakeFoodList")
    Observable<Result<JSONObject>> getTakeFoodList(@Query("deviceId") String deviceId, @Query("auth") String auth);

    @GET("dr/orders/receiveFood")
    Observable<Result<String>> receiveFood(@Query("pkIdList") List<Long> pkIdList);

    @GET("dr/orders/getOrderList")
    Observable<Result<List<ReserveListDto>>> getOrderList(@Query("deviceId") String deviceId, @Query("startTime") String startTime, @Query("endTime") String endTime,
                                                          @Query("posnum")String posnum);

    @GET("dr/orders/getDiningTableList")
    Observable<Result<List<DiningTableListDto>>> getDiningTableList(@Query("type") Integer type,
                                                                    @Query("startTime") String startTime,
                                                                    @Query("endTime") String endTime,
                                                                    @Query("bqh") String bqh,
                                                                    @Query("ksh") String ksh);

    @GET("dr/orders/getOrderDetails")
    Observable<Result<JSONArray>> getOrderDetails(@Query("orders") String orders);

    @GET("dr/orders/getDiningTableDetails")
    Observable<Result<JSONArray>> getDiningTableDetails(@Query("ksh") String ksh,
                                                        @Query("dinner") String dinner,
                                                        @Query("dcTime") String dcTime,
                                                        @Query("useTimes") String useTimes);

    @GET("dr/orders/cleanDiningTable")
    Observable<Result<String>> cleanDiningTable(@Query("ksh") String ksh,
                                                @Query("dinner") String dinner,
                                                @Query("dcTime") String dcTime);

    @DELETE("dr/sysSet/deleteKl")
    Observable<Result<List<KlStateRes>>> deleteKl(@Query("id") String id, @Query("deviceId") String deviceId);

    @POST("api/test/base64Upload")
    @FormUrlEncoded
    Observable<Result<String>> base64Upload(@Field("base64Data") String base64Data);


    @GET("dr/weekMenu/info")
    Observable<Result<String>> getInfo(@Query("deviceId") String deviceId, @Query("table") int table);


    @GET("dr/weekMenu/getWeekMenuBak")
    Observable<Result<String>> getWeekMenuBak(@Query("deviceId") String deviceId, @Query("tableName") int tableName,
                                              @Query("savedm") String savedm, @Query("date") String date);

    @Headers("Accept:application/json")
    @POST("dr/weekMenu/saveWeekMenuBak")
    Observable<Result<String>> saveWeekMenuBak(@Body RequestBody body);

    //
//
//    /**
//     * TODO Get请求
//     */
//    //第一种方式：GET不带参数
//    @GET("retrofit.txt")
//    Observable<BaseResponse<Demo>> getUser();
//    @GET
//    Observable<Demo> getUser(@Url String url);
//    @GET
//    Observable<Demo> getUser1(@Url String url); //简洁方式   直接获取所需数据
//    //第二种方式：GET带参数
//    @GET("api/data/{type}/{count}/{page}")
//    Observable<Demo> getUser(@Path("type") String type, @Path("count") int count, @Path("page") int page);
//    //第三种方式：GET带请求参数：https://api.github.com/users/whatever?client_id=xxxx&client_secret=yyyy
//    @GET("users/whatever")
//    Observable<Demo> getUser(@Query("client_id") String id, @Query("client_secret") String secret);
//    @GET("users/whatever")
//    Observable<Demo> getUser(@QueryMap Map<String, String> info);
//
//    /**
//     * TODO POST请求
//     */
    //第一种方式：@Body
    @Headers("Accept:application/json")
    @POST("WebAPI/UniformInterface.aspx")
    Observable<Demo> postUser(@Body RequestBody body);

    @GET("/tang/opera/getUserList")
    Observable<Result<List<SysUserModel>>> getPosNumList(@Query("addressNo") String addressNo);

//    //第二种方式：@Field
//    @Headers("Accept:application/json")
//    @POST("api/mobile/shop/staff/login")
//    @FormUrlEncoded
//    Observable<Demo> postUser(@Field("username") String username, @Field("password") String password);
//    //多个参数
//    Observable<Demo> postUser(@FieldMap Map<String, String> map);
//
//    /**
//     * TODO DELETE
//     */
//    @DELETE("member_follow_member/{id}")
//    Observable<Demo> delete(@Header("Authorization") String auth, @Path("id") int id);
//
//    /**
//     * TODO PUT
//     */
//    @PUT("member")
//    Observable<Demo> put(@HeaderMap Map<String, String> headers,
//                         @Query("nickname") String nickname);
//
//    /**
//     * TODO 文件上传
//     */
//    @Multipart
//    @POST("upload")
//    Observable<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);
//
//    //亲测可用
//    @Multipart
//    @POST("member/avatar")
//    Observable<Demo> uploadImage(@HeaderMap Map<String, String> headers, @Part MultipartBody.Part file);
//
//    /**
//     * 多文件上传
//     */
//    @Multipart
//    @POST("register")
//    Observable<ResponseBody> upload(@PartMap Map<String, RequestBody> params, @Part("description") RequestBody description);
//    //Observable<ResponseBody> upload(@Part() List<MultipartBody.Part> parts);
//
//    @Multipart
//    @POST("member/avatar")
//    Observable<Demo> uploadImage1(@HeaderMap Map<String, String> headers, @Part List<MultipartBody.Part> file);
//
//    /**
//     * 来自https://blog.csdn.net/impure/article/details/79658098
//     * @Streaming 这个注解必须添加，否则文件全部写入内存，文件过大会造成内存溢出
//     */
//    @Streaming
//    @GET
//    Observable<ResponseBody> download(@Header("RANGE") String start, @Url String url);
}
